package com.wang.springbootinit.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wang.springbootinit.common.ErrorCode;
import com.wang.springbootinit.exception.BusinessException;
import com.wang.springbootinit.mapper.ActivityMapper;
import com.wang.springbootinit.model.entity.Activity;
import com.wang.springbootinit.model.entity.Student;
import com.wang.springbootinit.model.entity.User;
import com.wang.springbootinit.service.ActivityService;
import com.wang.springbootinit.service.StudentService;
import com.wang.springbootinit.service.UserService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * 活动服务实现类
 * 实现活动相关的业务逻辑，包括活动的创建、管理、参与等功能
 */
@Service
public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity> implements ActivityService {

    @Resource
    private ActivityMapper activityMapper;
    
    @Resource
    private UserService userService;

    @Resource
    private StudentService studentService;

    /**
     * 添加活动
     * 创建新的活动记录，设置初始状态和时间
     *
     * @param activity 活动信息
     * @return 新创建的活动ID
     */
    @Override
    public long addActivity(Activity activity) {
        // 设置创建和更新时间
        Date now = new Date();
        activity.setCreateTime(now);
        activity.setUpdateTime(now);
        
        // 设置初始状态
        if (activity.getStatus() == null) {
            activity.setStatus(0);  // 未开始状态
        }
        activity.setPersonNum(0);
        
        activityMapper.insert(activity);
        return activity.getId();
    }

    /**
     * 获取活动详情
     * 根据ID查询活动信息
     *
     * @param id 活动ID
     * @return 活动信息，不存在则返回null
     */
    @Override
    public Activity getActivity(long id) {
        return activityMapper.selectById(id);
    }

    /**
     * 获取活动列表
     * 分页查询活动信息，支持按状态筛选，按创建时间倒序排列
     *
     * @param page 页码
     * @param pageSize 每页大小
     * @param status 活动状态，可选参数
     * @return 活动列表
     */
    @Override
    public List<Activity> listActivities(int page, int pageSize,String name,String type,Integer status) {
        Page<Activity> pager = new Page<>(page, pageSize);
        QueryWrapper<Activity> queryWrapper = new QueryWrapper<>();
        if (status != null) {
            queryWrapper.eq("status", status);
        }
        if(StrUtil.isNotEmpty(name)){
            queryWrapper.eq("name",name);
        }
        if (StrUtil.isNotEmpty(type)){
            queryWrapper.eq("type",type);
        }
        queryWrapper.orderByDesc("createTime");
        return activityMapper.selectPage(pager, queryWrapper).getRecords();
    }

    /**
     * 更新活动信息
     * 更新活动记录，同时更新修改时间
     *
     * @param activity 更新的活动信息
     * @return 是否更新成功
     */
    @Override
    public boolean updateActivity(Activity activity) {
        activity.setUpdateTime(new Date());
        return activityMapper.updateById(activity) > 0;
    }

    /**
     * 删除活动
     * 根据ID删除活动记录
     *
     * @param id 要删除的活动ID
     * @return 是否删除成功
     */
    @Override
    public boolean deleteActivity(long id) {
        return activityMapper.deleteById(id) > 0;
    }

    @Override
    public List<Activity> getCurrentActivities(HttpServletRequest request) {

        User loginUser = userService.getLoginUser(request);
        Long studentId = loginUser.getStudentId();

        if(ObjectUtil.isNull(studentId)){
            throw new BusinessException(ErrorCode.ACCOUNT_DOES_NOT_EXIST);
        }
        Student student = studentService.getStudentById(studentId);
        if(ObjectUtil.isNull(student)){
            throw new BusinessException(ErrorCode.ACCOUNT_DOES_NOT_EXIST);
        }

        LambdaQueryWrapper<Activity> queryWrapper = new LambdaQueryWrapper<>();
        //TODO 这里需要添加一个活动参与表，在参与表中去取参与的活动id，再查询活动列表，设计图上没写，没做

        List<Activity> list = list();
        return list;
    }

    /**
     * 更新活动状态
     * 根据活动的开始和结束时间自动更新活动状态
     */
    @Scheduled(cron = "0 0/5 * * * ?")  // 每5分钟执行一次
    public void updateActivityStatus() {
        Date now = new Date();
        List<Activity> activities = activityMapper.selectList(null);
        
        for (Activity activity : activities) {
            Integer newStatus = null;
            
            if (now.before(activity.getStartTime())) {
                newStatus = 0;  // 未开始
            } else if (now.after(activity.getEndTime())) {
                newStatus = 2;  // 已结束
            } else {
                newStatus = 1;  // 进行中
            }
            
            if (!newStatus.equals(activity.getStatus())) {
                activity.setStatus(newStatus);
                activity.setUpdateTime(now);
                activityMapper.updateById(activity);
            }
        }
    }
} 